package main

import (
	"fmt"
)

type Node struct {
	Data interface{}  // 数据域
	Next *Node    // 指针域
}
type List struct {
	headNode *Node  // 头结点
}

// 判断链表是否为空
func (this *List)IsEmpty() bool {
	if this.headNode == nil {
		return true
	}else {
		return false
	}
}
// 获取链表长度
func (this *List)Length() int {
	// 获取链表头结点
	cur := this.headNode
	count := 0
	for cur != nil {
		count ++
		// 地址后移
		cur = cur.Next
	}
	return count
}
// 从链表头部添加元素
func (this *List)Add(data interface{}) *Node {
	node := &Node{Data:data}
	node.Next = this.headNode
	this.headNode = node
	return node
}
// 从链表尾部添加元素
func (this *List)Append(data interface{}) {
	node := &Node{Data:data}
	if this.IsEmpty() {   // 空链表，当前节点作为头结点
		this.headNode = node
	}else {
		cur := this.headNode // 找到头结点
		for cur.Next != nil {
			cur = cur.Next
		}
		cur.Next = node
	}
}
// 在链表指定位置添加元素
func (this *List)Insert(index int, data interface{}) {
	if index < 0 {  // 进行头插
		this.Add(data)
	}else if index > 0 {   // 进行尾插
		this.Append(data)
	}else {
		pre := this.headNode
		count := 0
		for count < (index - 1) {
			pre = pre.Next
			count ++
		}
		// 循环结束，pre指向index - 1 的位置
		node := &Node{Data:data}
		node.Next = pre.Next
		pre.Next = node
	}
}
// 删除链表指定值的元素
func (this *List)RemoveValue(value interface{})  {
	pre := this.headNode
	if pre.Data == value {   // 如果删除的元素在头结点
		this.headNode = pre.Next
	}else {
		for pre.Next != nil {
			if pre.Next.Data == value {
				pre.Next = pre.Next.Next
			}else {
				pre = pre.Next
			}
		}
	}
}
// 删除指定位置的元素
func (this *List)RemoveIndex(index int) {
	pre := this.headNode
	if index <= 0 { // 删除头结点
		this.headNode = pre.Next
	}else if index > this.Length() {
		fmt.Println("超出链表长度")
	} else {
		count := 0
		for count != (index - 1) && pre.Next != nil {
			count ++
			pre = pre.Next
		}
		pre.Next = pre.Next.Next
	}
}
// 查看是否包含某个元素
func (this *List)Contain(value interface{}) bool {
	pre := this.headNode
	for pre != nil {
		if pre.Data == value {
			return true
		}
		pre = pre.Next
	}
	return false
}
// 遍历所有节点
func (this *List)ShowList() {
	if !this.IsEmpty() {
		cur := this.headNode
		for {
			fmt.Println(cur.Data)
			if cur.Next != nil {
				cur = cur.Next
			} else {
				break
			}
		}
	}
}

func main()  {
	// 初始化链表
	list := List{}
	list.Append(1)
	list.Append(2)
	list.Append(3)
	list.Append([]int{1,2,3})
	list.Append(map[string]string{"name":"jack"})
	//list.Append([]int{1,2,3}string())
	//list.Append([]int{1,2,3})

	fmt.Printf("链表的长度%d\n", list.Length())
	list.ShowList()

	fmt.Println(list.IsEmpty())
}


